package day01;

import java.util.Scanner;

/*
 * 题目：古典问题：有一对兔子，
 * 从出生后第3个月起每个月都生一对兔子，
 * 小兔子长到第三个月后每个月又生一对兔子，
 * 假如兔子都不死，问每个月的兔子对数为多少？ 
	程序分析： 兔子的规律为数列1,1,2,3,5,8,13,21.... 
	第一第二的数值为1，从第三天开始，其值为前两天值的和

 * */
public class Test01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//输入要求兔子个数的月份
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入要求兔子数量的月份");
		int m=sc.nextInt();
		//System.out.println(demo1(m));
		//demo2(m);
		System.out.println(demo3(m));

		

	}

	//方法一:用值替换的方式解决
	private static long demo1(int m) {
		long one=1;
		long two=1;
		long temp=0;
		if(m==1||m==2) {
			return 1;}
		else {
		for(int x=3;x<=m;x++) {
			temp=one+two;
			one=two;
			two=temp;
		}
		return temp;
			}
	}
	
	//方法二：用数组的方式求解
	private static void demo2(int m) {
		long[] arr=new long[m];
		if(m==1||m==2) {
			System.out.println(m+"月的兔子数量为1");
		}else {
			arr[0]=1;
			arr[1]=1;
		for(int x=2;x<=m-1;x++) {
			arr[x]=arr[x-1]+arr[x-2];
		}
		System.out.println(m+"月的兔子数量为"+arr[m-1]);
		}
		
	}
	
	//方式三：用递归调用的方式求解
	private static int demo3(int m) {
		if(m==1||m==2) {
			return 1;
		}else {
			return demo3(m-1)+demo3(m-2);
		}
	}
}
